package com.shujia.youhua

import org.apache.spark.SparkContext
import org.apache.spark.sql.{DataFrame, SparkSession}

/**
 *  在spark sql中使用广播变量
 */
object BroadcastDemo {
  def main(args: Array[String]): Unit = {
    val ss: SparkSession = SparkSession.builder()
      .master("local")
      .appName("spark sql使用广播变量")
      .getOrCreate()
    val sc: SparkContext = ss.sparkContext

    import ss.implicits._
    import org.apache.spark.sql.functions._

    val studentDF: DataFrame = ss.read
      .format("csv")
      .option("sep", ",")
      .schema("id STRING,name STRING,age INT,gender STRING,clazz STRING")
      .load("spark/data/students.txt")

    val scoreDF: DataFrame = ss.read
      .format("csv")
      .option("sep", ",")
      .schema("id STRING,subject_id STRING,score INT")
      .load("spark/data/score.txt")

    //将学生数据与成绩数据进行关联操作
    //我们以后遇到的关联操作,大部分都是小表关联大表
    //可以将小表放在前,大表放在后
    /**
     *  在local模式下:
     *    spark sql会自动将大表进行广播,单独进行一次作业执行, 当广播结束后才会执行我们的代码逻辑
     *
     *
     *  如果不是local: 比如是提交到yarn模式下的话
     *    spark sql则不会自动将大表进行广播,需要手动去指定..hint("broadcast")
     */
    val resDF: DataFrame = studentDF.join(scoreDF.hint("broadcast"), "id")
    resDF.show()

    while (true){

    }
  }
}
